//
//  Weibo.swift
//  zyqWeibo
//
//  Created by 张亚琼 on 15/7/1.
//  Copyright © 2015年 张亚琼. All rights reserved.
//

import UIKit
import SDWebImage

// 私有类常量
private let WB_Home_Timeline_URL = "2/statuses/home_timeline.json"
class Weibo: NSObject {
    //MARK: 定义各个属性
    // 微博创建时间
    var created_at: String?
    // 微博ID
    var id: Int = 0
    // 微博信息内容
    var text: String?
    // 微博来源
    var source: String?
    // 配图数组
    var pic_urls: [[String: String]]? {
        didSet {
            // 初始化配图数组
            imageUrls = [NSURL]()
            largeImageUrls = [NSURL]()
            // 将图片的url放入数组中
            for dict in pic_urls! {
                var urlString = dict["thumbnail_pic"]!
                // 问号和叹号是神马情况啊！！！
                imageUrls?.append(NSURL(string: urlString)!)
                urlString = urlString.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                largeImageUrls?.append(NSURL(string: urlString)!)
            }
        }
    }
    
    // 配图的url数组屏幕
    private var imageUrls:[NSURL]?
    // 新增计算型属性
    var pictureURLs:[NSURL]? {
        return retweeted_status != nil ? retweeted_status?.imageUrls : imageUrls
    }
    // 大图的url
    private var largeImageUrls:[NSURL]?
    // 计算性属性
    var largePicUrl:[NSURL]?{
        return retweeted_status != nil ? retweeted_status?.largeImageUrls : largeImageUrls
    }
    // 用户
    var user:WeiboUser?
    // 转发微博的原微博信息，当这个微博是转发微博时返回(类型也是微博)
    var retweeted_status: Weibo?
    
    //MARK: 类属性数组
    static let properties = ["created_at","id","text","source","pic_urls","user","retweeted_status"]
    
    // 字典转模型
    init(dict: [String: AnyObject]) {
        super.init()
        for key in Weibo.properties {
            // user和retweeted_status单独处理
            if dict[key] == nil || key == "user" || key == "retweeted_status" {
                continue
            }
            setValue(dict[key], forKey: key)
        }
        // 判断字典中是否有user这个key，如果有，取出来value进行数据转模型
        if let userDict = dict["user"] as? [String:AnyObject] {
            user = WeiboUser(dict: userDict)
        }
        
        if let retweetedDict = dict["retweeted_status"] as? [String:AnyObject]{
            // 不会死循环，转发微博里一定是原创微博，就不会再走这儿了
            retweeted_status = Weibo(dict: retweetedDict)
        }
    }
    //
    override var description: String {
        let dict = dictionaryWithValuesForKeys(Weibo.properties)
        return "\(dict)"
    }
    
    //MARK: 加载网路数据
    class func loadStatus(max_id:Int,since_id:Int,finished:(weibos: [Weibo]?,error:NSError?) -> ()) {
        // 断言，必须登录之后才能继续访问
        assert(sharedUserAccount != nil,"必须登录之后才能继续网络请求")
        
        // 参数
        var params = ["access_token": sharedUserAccount!.access_token]
        // 是否是下拉刷新
        if since_id > 0 {
            params["since_id"] = "\(since_id)"
        }
        
        if max_id > 0 {
            params["since_id"] = "0"
            // 因为传入max_id，返回的是小于等于max_id的微博，所以要减一
            params["max_id"] = "\(max_id - 1)"
        }
        NetworkTool.sharedNetworkTool().GET(WB_Home_Timeline_URL, parameters: params, success: { (_, JSON) -> Void in
//            print(JSON)
            // 输出之后可以看出返回的JSON是字典，其中微博数据的key是statuses
            let dict = JSON as! [String:AnyObject]
            // 包含了字典的数组
            let weibosList = dict["statuses"] as! [[String:AnyObject]]
            let list = weibosToData(weibosList)
            // 调用类方法，回调到控制器，因为要把数组传递回去，所以finished的参数是Status模型的数组
            //  不在这里更新UI,将数据中的图片进行缓存之后，再更新，所以把finished传递下去
//            finished(weibos: weibosToData(weibosList),error: nil)
            cacheWebImage(list, finished: finished)
            
            }) { (_, error) -> Void in
               finished(weibos: nil, error: error)
        }
        
    }
    // 缓存微博数组中的所有图片，参数是所有微博的数组、回调
    private class func cacheWebImage(weiboList:[Weibo],finished:(weibos: [Weibo]?,error:NSError?) -> ()) {
        print("刷新出来 \(weiboList.count) 条数据")
        // 定义调度组
        let group = dispatch_group_create()
        // 遍历微博数组
        for wei in weiboList {
            // 没有内容，或者是空的，就继续取下一条数据进行判断
            if wei.pictureURLs == nil || wei.pictureURLs!.isEmpty {
                continue
            }
//            print(wei.imageUrls)
            // 如果不为空，则继续判断，把图片进行缓存
            for url in wei.pictureURLs! {
                
                // 进入组，后续的代码会被group监听
                dispatch_group_enter(group)
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (_, _, _, _, _)  in
                    
                    // 代码执行到此，说明图片已经被缓存完成
                    // 2> 离开组
                    dispatch_group_leave(group)
                })

            }
        }
        // 监听群组调度执行
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            // 完成回调
            finished(weibos: weiboList, error: nil)
        }
        
    }
    
    //MARK: 把网络返回数据转换成数据模型
    // 参数是包含了字典的数组，返回的是包含了模型的数组
    private class func weibosToData(array:[[String:AnyObject]]) -> [Weibo]{
        // 定义一个可变数组，并且初始化
        var arrayM = [Weibo]()
        
        for dict in array {
            // 将dict转成模型放入可变数组
            arrayM.append(Weibo(dict: dict))
        }
        return arrayM
    }

}
